//
// Author: Vladimir Migashko <migashko@gmail.com>, (C) 2011
//
// Copyright: See COPYING file that comes with this distribution
//

#ifndef HITLIST_HITLIST_HPP
#define HITLIST_HITLIST_HPP

#include "ihitlist.hpp"
#include "ibackup.hpp"

class hit_container;

/** @brief Хранит хиты пользователей и делает бэкап */
class hitlist
  : public ihitlist
{
public:

  virtual ~hitlist();

  hitlist();

 /** Начальная инициализация
   * @param hit_interval максимальный интервал времени между хитами в которм хит считается за один (сек)
   * @param prepared_timelife время жизни кэша уникальных хитов (сек)
   * @param days_in_month дней в месяце (сколько дней хранить сообщение)
   * @param idle_timeout интервал запуска процедуры очистки устаревших хитов (сек)
   * @param idle_count количество юзеров у которых чистятся хиты за одну итерацию (сек)
   * @see hit_container::initialize
   */
  void initialize(time_t hit_interval, time_t prepared_timelife, time_t days_in_month, time_t idle_timeout, size_t idle_count);

  /** Добавить хит для пользователя 
   * @param first_id Идентификатор "кого смотрели" 
   * @param second_id Идентификатор "кто смотрел" 
   * Также передает данные для резервного сохранения 
   * @see ibackup
   */
  virtual bool hit(user_id_t first_id, user_id_t second_id);

  /** Добавить хит для пользователя
   * @param first_id Идентификатор "кого смотрели"
   * @param second_id Идентификатор "кто смотрел"
   * @param hit_time Время простмотра unix timespan
   * Не сохранияет данные в backup (если не в режиме тестирования). Используется для восстановления и тестирования.
   * @see hitlist::test_mode
   */
  virtual bool hit(user_id_t first_id, user_id_t second_id, time_t hit_time);

  /** Список хитов за день
   * @param first_id Идентификатор "кого смотрели"
   * @param offset
   * @param limit
   * @param hl вектор, куда будет скопирован результат
   * @see hit_item
  */
  virtual void day_hitlist( user_id_t first_id, size_t offset, size_t limit, std::vector<hit_item>& hl ) const;

  /** Список хитов за месяц
   * @param first_id Идентификатор "кого смотрели"
   * @param offset
   * @param limit
   * @param hl вектор, куда будет скопирован результат
   * @see hit_item
  */
  virtual void month_hitlist( user_id_t first_id, size_t offset, size_t limit, std::vector<hit_item>& hl ) const;

  /** @return уникальных просмотров за день */
  virtual size_t hits_day(user_id_t first_id) const;

  /** @return уникальных просмотров за месяц */
  virtual size_t hosts_day(user_id_t first_id) const;

  /** @return всего просмотров за месяц */
  virtual size_t hits_month(user_id_t first_id) const;

  /** @return всего просмотров за день */
  virtual size_t hosts_month(user_id_t first_id) const;

  /** общее количиство хитов для всех ползователей */
  size_t hits_size() const ;

  /** количиство уникальных хитов для всех ползователей 
   * @see hit_container::hosts_size
    */
  size_t hosts_size() const ;

  /** Задать объект для backup'a*/
  void backup(ibackup* b);

  /** @see hit_container::idle */
  std::pair<size_t, size_t> idle();

  /** Удалить все */
  void clear();

  /** включить тестовый режим (метод hit с тремя параметрами также бэкапится) 
   * @see hitlist::hit(user_id_t, user_id_t, time_t)
  */
  void test_mode(bool enable);
private:
  hit_container* _hitlist;
  ibackup* _backup;
  bool _test_mode;
};

#endif

